//package com.vast.admin.service.impl;
//
//import cn.hutool.core.date.DateTime;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.core.metadata.IPage;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.vast.common.core.domain.entity.SysUser;
//import com.vast.common.core.domain.entity.SysRole;
//import com.vast.admin.entity.RoleDept;
//import com.vast.admin.entity.RoleMenu;
//import com.vast.admin.entity.enums.OperatorEum;
//import com.vast.admin.entity.enums.QueryOrderEnum;
//import com.vast.admin.mapper.RoleMapper;
//import com.vast.admin.service.RoleDeptService;
//import com.vast.admin.service.RoleMenuService;
//import com.vast.admin.service.RoleService;
//import com.vast.admin.utils.QueryBuilder;
//import com.vast.admin.utils.TableFieldColumnsUtils;
//import com.vast.system.exception.BusinessException;
//import com.vast.system.shiro.ShiroUtils;
//import com.vast.system.utils.StringUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//
//@Service
//public class RoleServiceImpl extends ServiceImpl<RoleMapper, SysRole> implements RoleService {
//
//    @Autowired
//    private RoleMenuService roleMenuService;
//
//    @Autowired
//    private RoleDeptService roleDeptService;
//
//    @Autowired
//    private RoleMapper roleMapper;
//
//    @Override
//    public IPage<SysRole> queryList(Page<SysRole> page, boolean listMode, String queryItems, String orderField, QueryOrderEnum order) {
//        QueryWrapper<SysRole> queryWrapper = new QueryWrapper<>();
//        Map<String, String> fieldColumns = TableFieldColumnsUtils.getInstance().getFieldTableColumns(SysRole.class);
//        if (listMode) {
//            // size 小于 0 不在查询 total 及分页，自动调整为列表模式。
//            // 注意！！这个地方自己控制好！！
//            page.setSize(-1);
//        }
//        if (!StringUtils.isEmpty(queryItems)) {
//            List<QueryBuilder> queryBuilders = new ArrayList<>();
//            String[] queryItemArr = queryItems.split(";");
//            if(queryItemArr.length > 0){
//                for (String queryItemStr : queryItemArr) {
//                    String[] itemArr = queryItemStr.split(",");
//                    if(itemArr.length == 3){
//                        String as = itemArr[1];
//                        String params = itemArr[2];
//                        if(!StringUtils.isEmpty(params)){
//                            queryBuilders.add(new QueryBuilder(itemArr[0], OperatorEum.valueOf(as),itemArr[2]));
//                        }
//                    }
//                }
//            }
//
//            for (QueryBuilder queryBuilder : queryBuilders) {
//                //查询字段
//                String field = queryBuilder.getField();
//                //查询参数值
//                String params = queryBuilder.getParams();
//                if (fieldColumns.containsKey(field) && !StringUtils.isEmpty(params)) {
//                    //表属性
//                    String tableColumn = fieldColumns.get(field);
//                    if (queryBuilder.getAs() == OperatorEum.EQ) {
//                        queryWrapper.eq(tableColumn, params);
//                    }else if(queryBuilder.getAs() == OperatorEum.LIKE){
//                        queryWrapper.like(tableColumn, params);
//                    }else if(queryBuilder.getAs() == OperatorEum.LIKELEFT){
//                        queryWrapper.likeLeft(tableColumn, params);
//                    }else if(queryBuilder.getAs() == OperatorEum.LIKERIGHT){
//                        queryWrapper.likeRight(tableColumn, params);
//                    }else if(queryBuilder.getAs() == OperatorEum.GE){
//                        queryWrapper.ge(tableColumn, params);
//                    }else if(queryBuilder.getAs() == OperatorEum.LE){
//                        queryWrapper.le(tableColumn, params);
//                    }
//                }
//            }
//        }
//        if (!StringUtils.isEmpty(orderField)) {
//            String[] orderByColumns = orderField.split(",");
//            String queryOrderByColumns = "";
//            if (orderByColumns.length > 0) {
//                StringBuilder sb = new StringBuilder();
//                for (String orderByColumn : orderByColumns) {
//                    if (fieldColumns.containsKey(orderByColumn)) {
//                        sb.append(fieldColumns.get(orderByColumn)).append(",");
//                    }
//                }
//                if (sb.length() > 0) {
//                    queryOrderByColumns = sb.deleteCharAt(sb.length() - 1).toString();
//                }
//            }
//            if (!StringUtils.isEmpty(queryOrderByColumns)) {
//                if(order == null){
//                    order = QueryOrderEnum.ASC;
//                }
//                if (order == QueryOrderEnum.ASC) {
//                    queryWrapper.orderByAsc(queryOrderByColumns);
//                } else if (order == QueryOrderEnum.DESC) {
//                    queryWrapper.orderByDesc(queryOrderByColumns);
//                }
//            }
//
//        }
//        return baseMapper.selectPage(page, queryWrapper);
//    }
//
//    @Override
//    @Transactional
//    public boolean addOrUpdate(SysUser manager, SysRole role) {
//        if (role.getId() == null) {
//            role.setCreateBy(manager.getUserId());
//            role.setUpdateBy(manager.getUserId());
//            role.setCreateTime(DateTime.now());
//            role.setUpdateTime(DateTime.now());
//            role.setValid(1);
//            //添加角色
//            baseMapper.insert(role);
//
//            //保存角色和部门关系
//            roleDeptService.addOrUpdate(role.getId(),role.getDeptIdList());
//
//            //保存角色和菜单关系
//            Long[] menuIdList = role.getMenuIdList();
//            savaRoleMenus(role.getId(),menuIdList);
//
//            return true;
//        } else {
//            role.setUpdateBy(manager.getUserId());
//            role.setUpdateTime(DateTime.now());
//            role.setValid(1);
//            baseMapper.updateById(role);
////            boolean flag = roleMenuService.remove(new QueryWrapper<RoleMenu>().eq(RoleMenu.COL_ROLE_ID, role.getId()));
////            if(!flag){
////                return false;
////            }
//
//            //保存角色和部门关系
//            roleDeptService.addOrUpdate(role.getId(),role.getDeptIdList());
//
//            //保存角色和菜单关系
//            Long[] menuIdList = role.getMenuIdList();
//            savaRoleMenus(role.getId(),menuIdList);
//
//            return true;
//        }
//    }
//
//
//    public void savaRoleMenus(Long roleId, Long[] menuIds){
//        //删除角色和菜单关系
//        roleMenuService.remove(new QueryWrapper<RoleMenu>().eq(RoleMenu.COL_ROLE_ID, roleId));
//
//        //添加角色和菜单关系
//        if (menuIds != null && menuIds.length > 0) {
//            List<RoleMenu> roleMenus = new ArrayList<>();
//            for (Long mId : menuIds) {
//                RoleMenu roleMenu = new RoleMenu();
//                roleMenu.setCreateBy(ShiroUtils.getUserId());
//                roleMenu.setUpdateBy(ShiroUtils.getUserId());
//                roleMenu.setCreateTime(DateTime.now());
//                roleMenu.setUpdateTime(DateTime.now());
//                roleMenu.setRoleId(roleId);
//                roleMenu.setMenuId(mId);
//                roleMenus.add(roleMenu);
//            }
//            roleMenuService.saveBatch(roleMenus);
//        }
//    }
//
//    @Override
//    public SysRole info(SysUser manager, Long id) {
//        SysRole role = baseMapper.selectById(id);
//        if(role != null){
//            //获取角色对应的菜单
//            QueryWrapper<RoleMenu> roleMenuQueryWrapper = new QueryWrapper<>();
//            roleMenuQueryWrapper.eq(RoleMenu.COL_ROLE_ID, role.getId());
//            List<RoleMenu> roleMenus = roleMenuService.list(roleMenuQueryWrapper);
//            if(roleMenus != null && !roleMenus.isEmpty()){
//                List<Long> menuIds = new ArrayList<>();
////                Set<Long> menuIds = new HashSet<>()
//                for (RoleMenu roleMenu : roleMenus) {
//                    menuIds.add(roleMenu.getMenuId());
//                }
//                Long[] menuIdArr = new Long[menuIds.size()];
//                menuIds.toArray(menuIdArr);
//                role.setMenuIdList(menuIdArr);
//            }
//
//            //获取角色对应的部门
//            QueryWrapper<RoleDept> roleDeptQueryWrapper = new QueryWrapper<>();
//            roleDeptQueryWrapper.eq(RoleDept.COL_ROLE_ID, role.getId());
//            List<RoleDept> roleDepts = roleDeptService.list(roleDeptQueryWrapper);
//            if(roleDepts != null && !roleDepts.isEmpty()){
//                List<Long> deptIds = new ArrayList<>();
////                Set<Long> menuIds = new HashSet<>()
//                for (RoleDept roleDept : roleDepts) {
//                    deptIds.add(roleDept.getDeptId());
//                }
//                Long[] deptIdArr = new Long[deptIds.size()];
//                deptIds.toArray(deptIdArr);
//                role.setDeptIdList(deptIdArr);
//            }
//        }
//        return role;
//    }
//
//
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public boolean delete(SysUser manager, Long[] ids) {
//
//
//        //删除角色与菜单关联
//        roleMenuService.remove(new QueryWrapper<RoleMenu>().in(RoleMenu.COL_ROLE_ID,ids));
//        //删除角色与部门关联
//        roleDeptService.remove(new QueryWrapper<RoleDept>().in(RoleMenu.COL_ROLE_ID,ids));
//
//        //删除角色
//        List<Long> idsList = java.util.Arrays.asList(ids);
//        int count = baseMapper.deleteBatchIds(idsList);
//
//        return count == ids.length;
//
//    }
//
//    @Override
//    public List<SysRole> getByRoleIds(Long[] ids) {
//        List<SysRole> roles = new ArrayList<>();
//        if (ids != null) {
//            for (Long id : ids) {
//                SysRole role = super.getById(id);
//                if (role != null) {
//                    roles.add(role);
//                }
//            }
//        }
//        return roles;
//    }
//
//
//    @Override
//    public void checkRoleAllowed(SysRole role) {
//        if (StringUtils.isNotNull(role.getId()) && role.isAdmin())
//        {
//            throw new BusinessException("不允许操作超级管理员角色");
//        }
//    }
//
//    /**
//     * 修改数据权限信息
//     *
//     * @param role 角色信息
//     * @return 结果
//     */
//    @Override
//    @Transactional
//    public int authDataScope(SysRole role)
//    {
//        // 修改角色信息
//        baseMapper.updateById(role);
//        // 删除角色与部门关联
//        roleDeptService.deleteRoleDeptByRoleId(role.getId());
//        // 新增角色和部门信息（数据权限）
//        return insertRoleDept(role);
//    }
//
//    @Override
//    public List<SysRole> selectRoleAll(int sort) {
//        SysRole role = new SysRole();
//        role.setSort(sort);
//        return roleMapper.selectRoleList(new Page<SysRole>().setSize(-1),role).getRecords();
//    }
//
//    @Override
//    public List<Integer> selectRoleListByUserId(Long userId) {
//        return baseMapper.selectRoleListByUserId(userId);
//    }
//
//
//    /**
//     * 根据条件分页查询角色数据
//     *
//     * @param role 角色信息
//     * @return 角色数据集合信息
//     */
//    @Override
//    public IPage<SysRole> selectRoleList(Page<SysRole> page, SysRole role){
//        return baseMapper.selectRoleList(page, role);
//    }
//
//    /**
//     * 新增角色部门信息(数据权限)
//     *
//     * @param role 角色对象
//     */
//    public int insertRoleDept(SysRole role)
//    {
//        int rows = 1;
//        // 新增角色与部门（数据权限）管理
//        List<RoleDept> list = new ArrayList<RoleDept>();
//        for (Long deptId : role.getDeptIdList())
//        {
//            RoleDept rd = new RoleDept();
//            rd.setRoleId(role.getId());
//            rd.setDeptId(deptId);
//            list.add(rd);
//        }
//        if (list.size() > 0)
//        {
//            rows = roleDeptService.saveBatch(list)==true?1:0;
//        }
//        return rows;
//    }
//}
//
//
